#pragma once
#include"configure/switch.hpp"

/*
对齐的好处：
- 对于当前 cpu-mem 结构，对齐的内存能提升访问效率
- 地址是对齐的，这样存放该内存的指针的低位可以空出来存放其他信息
  比如是 32 字节对齐，那么存放该内存的指针低 5bit(2^5 = 32) 默认为 0
  我们可以将这低 5bit 存放其他信息，在访问该内存的时候先屏蔽低 5bit 就好了
  这种方式能在一定程度节省内存

用法1：
#include"macro/xalign.hpp"

void foo(){
    // buffer 默认也许会按照元素类型进行字节对齐(默认 4 字节对齐)
    // 使用 xalign(32)
    // buffer 的地址就会按照 32 字节对齐了
    // 如 buffer:0x00007FFC8A8C8620
    xalign(32) int buffer[8];

    // 使用 8 字节对齐不会让 sizeof(foo) 变成 8(仍是 sizeof(int) 的大小)
    // 但是编译器可能会为它空出内存空间以便 foo 的起始地址是 8 的整数倍
    xalign(8) int foo;

    // 错误用法，对齐字节数必须是 2 的指数倍
    xalign(7) int bar;

    // 错误用法，对齐字节数不得小于当前元素的的默认大小(1 < sizeof(int))
    // 所以不起作用
    xalign(1) int m;
}


用法2:
#include"macro/xalign.hpp"

// 这个结构体按 32 字节对齐
// ax 结构体变量的起始地址将是 32 字节对齐的
// sizeof(ax) 的大小也按 32 字节对齐，不足 32 字节的部分按 32 字节算
struct xalign(32) ax{
    int a;
};

// 错误用法，该结构体占用的字节数不会是的 5(假设 int 占 4 字节) 个字节
struct xalign(1) bx{
    char a;
    int  b;
};

struct cx{
    char a;

    // 错误用法，对齐字节数不得小于当前元素的的默认大小(1 < sizeof(int))
    // 所以不起作用
    xalign(1) int b;
};
*/

#if xis_msvc_native
    #define xalign(...)     __declspec(align(__VA_ARGS__))
#else
    #define xalign(...)     __attribute__((aligned(__VA_ARGS__)))
#endif
